博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
tornado学习笔记(三)
阅读量:7009 次
发布时间:2019-06-28

本文共 4892 字,大约阅读时间需要 16 分钟。

3 Extending Templates

1 blocks and substitutions

模板可以继承于基类模板,这样可以重复使用很多模块减少代码量

如在index.html中继承main.html,在index.html的开头加上:{% extends "main.html" %}

block:划定一些扩展模板的时候可能需要修改的代码块,在子类中直接通过block name就可以重写这一块

如在main.html中:

{% block header %}{% end %}

在子模板index.html中:

{% extend main.html %}{% block header %}    

hello world

{% end %}

2 autoescaping

escape的意思就是转义,将一些原本是script中的符号换一些编码表示,如<变为&lt;, 在浏览器显示的时候才显示出原来的字符,这样是为了安全起见,比如别人在文章评论中可能上传一些<script>alert('dangerous...')</script>的文本来进行攻击,会导致我们打开网页弹出警告框.

默认情况下tornado会自动escape模板中的内容,但有些时候自动转义会导致一些变量无法正常使用,如在模板中有

{% set mailLink = "Contact Us" %}{
{ mailLink }}

本来是设置一个邮件地址作为变量,但是由于转义变成类似&lt;a href=&quot;mailto:contact@burtsbooks.... 为了处理这种情况,我们可以自己设置关闭自动转义,加上{% autoescape None %}

关闭自动转义虽然可以处理但是又少了保护机制,所以还有一种解决方法是加上raw block: {% raw mailLink %}

3 UI modules

Modules是继承于tornado的UIModule类的一个python类,当遇到{% module Foo(...) %}这种标签,会调用模块的render函数,返回一个string替换module标签。

UI模块可以嵌入js,css文件

basic module usage

要在模板中使用module,首先需要在应用中声明,ui_modules参数接受一个dict将模块名字映射到渲染它们的类

hello.py

import os.pathimport tornado.httpserverimport tornado.ioloopimport tornado.optionsimport tornado.webfrom tornado.options import define, optionsdefine("port", default=8000, help="run on the given port", type=int)class HelloHandler(tornado.web.RequestHandler):    def get(self):        self.render('hello.html')class HelloModule(tornado.web.UIModule):    def render(self):        return '

hello world!

'if __name__ == '__main__': tornado.options.parse_command_line() app = tornado.web.Application( handlers=[(r'/', HelloHandler)], template_path = os.path.join(os.path.dirname(__file__), 'templates'), ui_modules={'Hello': HelloModule} ) server = tornado.httpserver.HTTPServer(app) server.listen(options.port) tornado.ioloop.IOLoop.instance().start()

hello.html

    UI module example            {% module Hello() %}    

例子中ui_modules={'Hello': HelloModule}定义Hello模块是用HelloModule类来进行处理,所以html中间中的模块标签会被替换为HelloModule类中返回的内容

modules in depth

在看Burt's books的例子,现在建立一个页面用来推荐一些书,每一本书都是用同样的模板进行渲染,创建modules/book.html文件:

{
{ book["title"] }}

{% if book["subtitle"] != "" %}

{
{ book["subtitle"] }}

{% end %}
released: {
{ book["date_released"] }}
added: {
{ locale.format_date(book["date_added"], relative=False) }}
description:
{% raw book["description"] %}

这个模板接受名为book的字典,然后定义展示一本书的形式,函数locale.format_date()是tornado中提供时间功能的函数,参数为时间,relative=False说明是绝对时间

在recommended.html中,对每一本书调用Book模块来进行渲染:

{% extends "main.html" %}{% block body %}

recommended reading

{% for book in books %} {% module Book(book) %} {% end %}{% end %}

在py文件中,建立RecommendedHandler类和BookModule类

class RecommendedHandler(tornado.web.RequestHandler):    def get(self):        self.render(            "recommended.html",            page_title="burt's books | recommended reading",            header_text="recommended reading",            books=[                {                    "title": "Programming Collective Intelligence",                    "subtitle": "Building Smart Web 2.0 Applications",                    "image": "/static/images/collective_intelligence.gif",                    "author": "Toby Segaran",                    "date_added": 1310248056,                    "date_released": "August 2007",                    "isbn": "978-0-596-52932-1",                    "description": "

This fascinating book demonstrates how you " + "can build web applications to mine the enormous " + "amount of data created by people...

" }, ] )class BookModule(tornado.web.UIModule): def render(self, book): return self.render_string('modules/book.html', book=book)if __name__ == "__main__": ... ui_modules = { "Book": BookModule, } ...

render_string是将模板渲染后以string的形式返回,这里的逻辑是请求首先通过RecommendedHandler类来处理,这个类使用模板recommended.html来渲染,然后在这个模板中对于每一本书的渲染将调用BookModule类来处理

embedding javascript and css

一些用来在模板中嵌入jss,cs,html等的函数:

  • embedded_css()
  • embedded_javascript()
  • html_body()
  • css_files()
  • javascript_files()

1.embedded_javascript

class BookModule(tornado.web.UIModule):    def render(self, book):        return ...    def embedded_javascript(self):        return "document.write(\"hi!\")"

2.函数中插入的内容在html中将会内置在<script>标签中,放在</body>标签的前面

3.embedded_css用法类似,插入的内容内置在<style>标签中,eg

def embedded_css(self):    return ".book {background-color:#F5F5F5}"

4.html_body()函数可以在</body>前加入html语句

def html_body(self):    reutrn ""

5.css_files(), javascript_files()可以引用css,js文件

def css_files(self):    return "static/css/style.css"def javascript(self):    return "https://ajax.googleapis.com/ajax/.../jquery-ui.min.js"

转载于:https://www.cnblogs.com/jolin123/p/4505792.html

你可能感兴趣的文章
OpenGL Android课程四:介绍纹理基础
查看>>
URL中“#” “?” &“”号的作用
查看>>
jQuery_渐隐式轮播效果插件封装
查看>>
以太坊2.0协议核心Beacon链详解
查看>>
机器学习资料合计(一)
查看>>
Redis 的基础数据结构(二) 整数集合、跳跃表、压缩列表
查看>>
webpack由浅入深——(webapck简易版)
查看>>
RxSwift(伪)实战 组内分享
查看>>
2 - 建立 Django 博客应用
查看>>
【iOS报错】“this class is not key value coding-compliant for the key userPhoneNum”给字典设置键值对的时候报错...
查看>>
UI技术总结--性能优化
查看>>
Android NDK JNI 开发之旅01 环境搭建入门篇
查看>>
Javascript之迭代器模式
查看>>
Flutter花式玩转TextField,写一个验证码输入框超简单!
查看>>
RxJava应用:实现七牛云多图上传
查看>>
Tmux入门教程
查看>>
智能直播审核方案:视频云智能业务截帧策略
查看>>
亲历者说:Kubernetes API 与 Operator,不为人知的开发者战争
查看>>
[ARKit]10-3D模型怎么制作,哪里寻找,如何使用?
查看>>
Kotlin结合DataBinding简单封装一个RecyclerView的Adapter
查看>>